package com.hsurosy.hsuchain.nft.order.domain.listener;

import com.hsurosy.hsuchain.nft.api.order.OrderFacadeService;
import com.hsurosy.hsuchain.nft.api.order.request.OrderConfirmRequest;
import com.hsurosy.hsuchain.nft.api.user.constant.UserType;
import com.hsurosy.hsuchain.nft.order.domain.entity.TradeOrder;
import com.hsurosy.hsuchain.nft.order.domain.listener.event.OrderCreateEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;

import java.util.Date;

/**
 * 订单事件监听器
 *
 * @Author Hsu琛君珩
 * @Date 2024-10-05 17:47
 * @Description
 * @Version: v1.0.0
 */
@Component
public class OrderEventListener {

    /**
     * 订单服务，用于处理订单确认等操作
     */
    @Autowired
    private OrderFacadeService orderFacadeService;

    /**
     * 处理订单创建事件
     * <p>
     * 当订单创建事件触发时，异步调用此方法，将订单确认请求发送至订单服务。
     *
     * @param event 订单创建事件，包含订单的基本信息
     */
    @EventListener(OrderCreateEvent.class)
    @Async("orderListenExecutor")
    public void onApplicationEvent(OrderCreateEvent event) {

        // 获取事件中的订单信息
        TradeOrder tradeOrder = (TradeOrder) event.getSource();

        // 构造订单确认请求
        OrderConfirmRequest confirmRequest = new OrderConfirmRequest();
        confirmRequest.setOperator(UserType.PLATFORM.name()); // 设置操作员类型为平台
        confirmRequest.setOperatorType(UserType.PLATFORM); // 操作员类型
        confirmRequest.setOrderId(tradeOrder.getOrderId()); // 订单ID
        confirmRequest.setIdentifier(tradeOrder.getIdentifier()); // 幂等号
        confirmRequest.setOperateTime(new Date()); // 操作时间

        // 调用订单服务进行订单确认
        orderFacadeService.confirm(confirmRequest);
    }
}
